/**
 * 常量
 */
// constantize实现递归freeze
var constantize = (obj) => {
	Object.freeze(obj);
	Object.keys(obj).forEach( (key, i) => {
		if(typeof obj[key] === 'object' ) {
			constantize( obj[key] );
		}
	});
}
var SysConstant = {
			  SUCCESS: 'SUCCESS',
			   FAILED: 'FAILED',
			    ERROR: 'ERROR',
			EXCEPTION: 'EXCEPTION'
}
constantize(SysConstant);

var ctx = $("#siteContext").data("ctx");
var currentUserId = $("#siteUserId").data("val");
/**  
 * 封装ajax
 * 调用示例：ajax(true, true, 'POST', 'www.baidu.com', 'text', {'username':'zs'}, successfunc, errorfunc);
 * 
 * @param async 是否异步传输 true是异步，false是同步传输   
 * @param cache 是否开启缓存  
 * @param type ajax的传输类型 POST 或 GET  
 * @param url  是请求的目标url
 * @param datatype 服务器返回的数据类型 text:纯文本 | html:HTML信息包括script标签会在插入DOM时执行 | script:返回纯文本JavaScript代码 | json:json数据 | jsonp:jsonp数据格式 | xml:返回XML文档   
 * @param data 是要传输的数据
 * @param successfunc 当ajax执行成功之后跳转到自己的函数
 * @param errorfunc 当ajax执行成功之后跳转到自己的函数
 * @returns {undefined}  
 */  
function ajax(async, cache, type, url, datatype, contentType, data, successfunc, errorfunc) {
    $.ajax({  
    	async: async,  
        cache: cache,  
        type: type,  
        url: ctx + url,  
        dataType: datatype,
        contentType: contentType,
        data: data,  
        beforSend: function () {  
        },  
        error: function (data) {  
        	errorfunc(data);
        },  
        success: function (data) {  
        	successfunc(data);  
        }  
    });  
} 
/**
 * 精简了的以post形式向后台请求的ajax
 * 调用示例：ajax(true, 'www.baidu.com', 'text', {'username':'zs'}, successfunc, errorfunc);
 * 其中errorfunc可不传
 * @param async
 * @param url
 * @param datatype
 * @param data
 * @param successfunc
 * @param errorfunc
 * @returns
 */
function simpleAjaxPost(async, url, datatype, data, successfunc, errorfunc) {
	ajax(async, true, 'POST', url, datatype, "application/x-www-form-urlencoded", data, successfunc, errorfunc);
}
/**
 * 精简了的以post形式向后台请求的异步ajax
 * 调用示例：ajax('www.baidu.com', 'text', {'username':'zs'}, successfunc, errorfunc);
 * 其中errorfunc可不传
 * @param url
 * @param datatype
 * @param data
 * @param successfunc
 * @param errorfunc
 * @returns
 */
function simpleAsyncAjaxPost(url, datatype, data, successfunc, errorfunc) {
	ajax(true, true, 'POST', url, datatype, "application/x-www-form-urlencoded", data, successfunc, errorfunc);
}

/**
 * 以json的形式向后台请求
 * @param url
 * @param datatype
 * @param data
 * @param successfunc
 * @param errorfunc
 * @returns
 */
function jsonAjax(url, datatype, data, successfunc, errorfunc) {
	ajax(true, true, 'POST', url, datatype, "application/json", data, successfunc, errorfunc);
}

/**<pre>
 * 正则验证
 * @param domSelector 选择器，传入的应该是：#abc或者.abc
 * @param rule 验证规则，目前的规则有：
 * 	 natural: 数字类型 >= 0,
 * 	    date: 日期类型 yyyy-MM-dd,
 * 	datetime: 时间类型 yyyy-MM-dd HH:mm:ss,
 * 	 decimal: 小数类型,
 * 	identity: 身份证号
 * 	password: 密码
 * @returns
 * </pre>
 */
function validInput(domSelector, rule, tips) {
	
	var reg = [
		[        'requried', '/\\S/','不能为空'],
		[         'natural', '/^\\d+$/','格式不正确！只能填写大于等于0的整数'],
		[            'date', '/^(\\d{4})[-\\/](\\d{1}|0\\d{1}|1[0-2])([-\\/](\\d{1}|0\\d{1}|[1-2][0-9]|3[0-1]))*$/','日期格式不正确，应该形如：2017-07-01'],
		[        'datetime', '/^(?:19|20)[0-9][0-9]-(?:(?:0[1-9])|(?:1[0-2]))-(?:(?:[0-2][1-9])|(?:[1-3][0-1])) (?:(?:[0-2][0-3])|(?:[0-1][0-9])):[0-5][0-9]:[0-5][0-9]$/','时间格式不正确，应该形如：2017-11-10 09:54:23'],
		[         'decimal', '/^[0-9]+\\.?[0-9]*$/','格式不正确！只能填写大于等于零的整数或者小数'],
		[        'identity', '/(^\\d{15}$)|(^\\d{17}(x|X|\\d)$)/','格式不正确！只能填写身份证号'],
		[         'account', '/^[a-zA-Z0-9_-]{4,16}$/', '账号长度为4-16位，且只能由字母数字下划线开头'],
		[ 'accountAndEmail', '/^[a-zA-Z0-9_-]{4,16}|[a-z0-9]+([\\._\\-]*[a-z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+\\.){1,63}[a-z0-9]+$/', '账号长度为4-16位，且只能由字母数字下划线开头，或者是你的邮箱'],
		[        'password', '/^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{8,20}$/','密码必须8到20位数字或者字母组成，不能是纯数字或者字母']
	];
	var $dom = $(domSelector);
	if($dom.length > 0) {
		var value = $dom.val();
		if(value == null || value.length == 0) {
			value = '';
		}
		for(var i = 0; i < reg.length; i++) {
			for(var j = 0; j < rule.length; j++){
				if(rule[j] == reg[i][0]) {
					if(!(eval(reg[i][1]).test(value))) {
						var time = 2000;
						if(tips) {
							tipsBlur(domSelector, tips, time);
						} else {
							tipsBlur(domSelector, reg[i][2], time);
						}
						return false;
					}
				}
			}
		}
		return true;
	}
	return false;
}
/**
 * 验证不通过时边框变色
 * domId 
 * msg 提示信息
 * time 显示时间(毫秒)
 * @returns
 */
function tipsBlur(domId, msg, time) {
	var $dom = $(domId);
	if($dom.length > 0) {
		var tagName = $dom[0].tagName;
		if(tagName == 'SELECT') {
			$dom = $dom.next().find(".select2-selection");
		} 
		
		if(!time) {
			time = 3000;
		}
		$dom.addClass("required-border");
		setTimeout(function() {
			$dom.removeClass("required-border");
		},time);
		layer.msg(msg, {time: time, icon:5});
	}
}
/**
 * 成功时的提示
 * @param msg
 * @returns
 */
function tipsSuccess(msg, time) {
	if(!time) {
		time = 3000;
	}
	layer.msg(msg, {time: time, icon:6});
}
/**
 * 失败时的提示
 * @param msg
 * @returns
 */
function tipsFailed(msg, time) {
	if(!time) {
		time = 3000;
	}
	layer.msg(msg, {time: time, icon:5});
}
/**
 * 询问框
 * @param title
 * @param btnOk
 * @param funcOk
 * @param btnCancel
 * @param funcCancel
 * @returns
 */
function showConfirm(title, funcOk, funcCancel, btnOk, btnCancel) {
	if(!btnOk) {
		btnOk = "确认";
	}
	if(!btnCancel) {
		btnCancel = "取消";
	}
	layer.confirm(title, {
		skin: 'layui-layer-molv',
		btn: [btnOk, btnCancel] //按钮
	}, function(){
		funcOk();
	}, function(){
		funcCancel();
	});
}
/**
 * 提交延迟的时候转圈
 * @returns
 */
function submitHolder() {
	var index = layer.load(1, {
		shade: [0.1,'#fff'] //0.1透明度的白色背景
	});
	return index
}
/**
 * 关闭小圈圈
 * @param loadingIndex
 * @returns
 */
function closeSubmitHolder(loadingIndex) {
	layer.close(loadingIndex);
}
/**
 * 关闭全部的弹窗
 * @returns
 */
function closeAll() {
	layer.closeAll('dialog');
}
/**
 * 清空form表单
 * @param formDom 可以传id或者class
 * @returns
 */
function clearForm(formDom) {
	$(':input', formDom) 
	.not(':button, :submit, :reset, :hidden') 
	.val('') 
	.removeAttr('checked') 
	.removeAttr('selected');
}